package com.firebird.app.kotlin.stock.trend

import android.app.AlarmManager
import android.app.Application
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Process
import com.firebird.app.kotlin.stock.trend.activity.BeginActivity
import com.firebird.app.kotlin.stock.trend.utils.Log


/**
 * 自定义全局未捕获异常处理
 * @author ljk
 * @date   2019年11月17日
 */
class StockGlobalExceptionHandler private constructor() : Thread.UncaughtExceptionHandler {
    private var application: Application? = null
    //系统默认的UncaughtException处理类
    private var defaultExcepthinHandler: Thread.UncaughtExceptionHandler? = null

    fun init(application: Application?) {
        this.application = application
        //获取系统默认的UncaughtException处理器
        defaultExcepthinHandler = Thread.getDefaultUncaughtExceptionHandler()
        //为系统设置自定义的全局异常处理器
        Thread.setDefaultUncaughtExceptionHandler(this)
        Log.d(TAG, "全局异常处理器初始化完毕！")
    }

    /**
     * 出现为捕获的异常时会进入该方法中进行处理
     */
    override fun uncaughtException(thread: Thread, ex: Throwable) {
        if (!handlerException(ex) && defaultExcepthinHandler != null) { //如果自定义的全局异常处理器不处理，则交给系统处理
            Log.d(TAG, "全局异常处理器无法处理未捕获异常，交由系统处理！")
            defaultExcepthinHandler!!.uncaughtException(thread, ex)
        }
    }

    /**
     * 全局异常处理逻辑
     * @param ex
     * @return    true 该方法已处理了异常，false 该方法未处理异常
     */
    private fun handlerException(ex: Throwable?): Boolean {
        if (ex == null) {
            return false
        }
        val intent = Intent(application!!.applicationContext, BeginActivity::class.java)
        val restartIntent = PendingIntent.getActivity(
                application!!.applicationContext, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK)
        //退出程序
        val mgr = application!!.getSystemService(Context.ALARM_SERVICE) as AlarmManager
        mgr[AlarmManager.RTC, System.currentTimeMillis() + 2000] = restartIntent // 1秒钟后重启应用
        Process.killProcess(Process.myPid())
        System.exit(1)
        Log.d(TAG, "//////////////////////////// 异常我已经处理了 ////////////////////")
        return true
    }

    companion object {
        private const val TAG = "StockUncaughtExceptionHandler"
        private var globalExceptionHandler: StockGlobalExceptionHandler? = null
        /**
         * 单例模式创建全局异常处理对象
         * @return
         */
        val instance: StockGlobalExceptionHandler?
            get() {
                if (globalExceptionHandler == null) {
                    globalExceptionHandler = StockGlobalExceptionHandler()
                    return globalExceptionHandler
                }
                return globalExceptionHandler
            }
    }
}
